import datetime

from flask import Response, jsonify, Flask, request, Blueprint,url_for
from configs import *
from modules.Tables import *


# 创建蓝图，对应的register目录
role_view = Blueprint('role_view', __name__)


# 角色信息获取（角色管理）
@role_view.route('/permission_manage_data', methods=['GET'])
@jwt_required()
def permission_manage_data():
    # 第几页
    page = request.args.get('page', default=1, type=int)
    # 每页条数
    per_page = request.args.get('per_page', default=15, type=int)

    permission_data = db.session.query(Permission).paginate(page=page, per_page=per_page, error_out=False)

    # 构建返回的 JSON
    response_data = {
        'total_items': permission_data.total,
        'total_pages': permission_data.pages,
        'current_page': permission_data.page,
        'per_page': per_page,
        'data': [
        {'id': i.id, 'permission_name': i.permission_name, 'permission_content': i.permission_content,
         'permission_status': i.permission_status,'permission_code':i.permission_code,'created_at':i.created_at}
        for i in permission_data.items
    ]
    }
    return jsonify({'code': 200, 'data': response_data,'msg':'查询成功'})

# 角色状态修改（角色管理）
@role_view.route('/permission_manage_status_update', methods=['POST'])
@jwt_required()
@jwt_required_with_refresh
def permission_manage_status_update():
    # 角色id
    permission_id = request.form.get('permission_id', None)
    # 角色启用状态  1启用 2禁用
    permission_status = request.form.get('permission_status', 1)
    # 当用户id与用户状态存在
    if permission_id and permission_status:
        # 查询用户相同并且修改状态
        db.session.query(Permission).filter(Permission.id == permission_id).update({'permission_status': permission_status})
        # 数据提交
        db.session.commit()
        return jsonify({'code': 200, 'message': '角色状态修改成功'})
    return jsonify({'code': 400, 'message': '角色及状态未输入'})


@role_view.route('permission_manage_delete', methods=['POST'])
@jwt_required()
@jwt_required_with_refresh
def permission_manage_delete():
    """
    删除角色及其对应权限数据

    参数:
        permission_id (str): 要删除的角色ID
    返回:
        json: 响应结果，包含状态码和消息
    """
    # 获取角色ID
    permission_id = request.form.get('permission_id', None)

    if not permission_id:
        return jsonify({'code': 400, 'message': '角色ID缺失'})

    # 查找对应角色数据
    permiss_data = db.session.query(Permission).filter(Permission.id == permission_id).first()

    if not permiss_data:
        return jsonify({'code': 404, 'message': '角色不存在'})

    try:
        # 删除角色数据
        db.session.delete(permiss_data)

        # 删除角色对应的所有权限数据
        db.session.query(PermissionMenu).filter(
            PermissionMenu.premission_id == permission_id
        ).delete(synchronize_session=False)
        print(f"删除{permission_id}对应权限数据！")

        # 提交事务
        db.session.commit()
        return jsonify({'code': 200, 'message': '角色删除成功'})

    except Exception as e:
        # 捕获异常并回滚事务
        db.session.rollback()
        return jsonify({'code': 500, 'message': f'删除角色时发生错误: {str(e)}'})


# 角色相关菜单筛选接口
@role_view.route('/permission_manage_select', methods=['GET'])
@jwt_required()
@jwt_required_with_refresh
def permission_manage_select():

    # 角色id
    permission_id = request.args.get('permission_id', None)

    # 当没有获取到角色id
    if not permission_id:
        return jsonify({'code': 400, 'message': '角色id不存在'})

    # 获取角色权限数据
    permission_menu = db.session.query(PermissionMenu).filter(
        PermissionMenu.premission_id==permission_id).all()

    # 提取菜单标识字段并去重 (集合{}唯一去重)
    menu_ids = {item.menu_id for item in permission_menu}

    # 将结果转换为列表
    menu_ids_list = list(menu_ids)

    # 查找菜单表中 menu_ids_list所对应id的记录
    menu_list = convert_folder_to_dict_list(
        db.session.query(
            PermissionMenu.id.label('permissionmenu_id'),
            PermissionMenu.permissions_list,
            Menu.id.label('menu_id'),Menu.menu_name,Menu.menu_link,
            Menu.menu_icon,Menu.menu_order,Menu.menu_parent_id,
            Permission.id.label('permission_id'),
        )
            .join(Menu,PermissionMenu.menu_id==Menu.id)
            .join(Permission,PermissionMenu.premission_id==Permission.id)
            .filter(Menu.id.in_(menu_ids_list),Menu.menu_status==1,Permission.id==permission_id).all(),
    ['menu_id','menu_name','menu_link','menu_icon','menu_status','menu_order','menu_parent_id','permissionmenu_id','permission_id','permissions_list'])

    # 自定义排序函数  按照菜单表自定义顺序来对菜单进行排序
    def custom_sort(menu):
        return menu.get('menu_order', 0)

    # 对菜单项列表进行排序
    sorted_menu_items = sorted(menu_list, key=custom_sort)

    # 从 menu_parent_id为none主节点开始找  （递归找出所有子类菜单）
    def build_tree(data, parent_id=None):
        tree = []
        for item in data:
            if item['menu_parent_id'] == parent_id:
                children = build_tree(data, item['menu_id'])
                if children:
                    item['children'] = children
                tree.append(item)
        return tree

    # 调用方法获取父子菜单组装数据
    menu_list = build_tree(sorted_menu_items)

    return jsonify({'code': 200, 'data': menu_list})


# 角色相关菜单权限修改接口（角色管理）
@role_view.route('/permission_manage_update', methods=['POST'])
@jwt_required()
@jwt_required_with_refresh
def permission_manage_update():
    """
    更新权限标识列表数据，先删除对应权限的所有数据，然后再批量新增。

    参数:
        permission_id (int): 要更新的权限 ID。
        menu_permissions_list (str): 权限标识列表（字符串格式，需要通过 eval 转换为列表）。
    """

    # 获取角色ID
    permission_id = request.form.get('permission_id', None)

    # 获取权限对应菜单及增删改查标识列表
    menu_permissions_list = request.form.get('permissions_list', '[]')

    # 预设示例数据，仅供测试
    # menu_permissions_list = "[{'menu_id':'1','permissions_list':'[c,r,u,d]'},{'menu_id':'2','permissions_list':'[c,r,u,d]'},{'menu_id':'3','permissions_list':'[c,r,u,d]'}]"

    # 如果获取到权限标识列表数据
    if menu_permissions_list and menu_permissions_list != '[]':
        try:
            # 将字符串形式的列表转换为实际的列表对象
            permission_list = eval(menu_permissions_list)  # 尽量避免使用 eval

            # 检查是否转换成功且非空
            if not permission_list or not isinstance(permission_list, list):
                return jsonify({'code': 400, 'msg': '权限标识列表格式错误！'})

            # 先删除对应权限的所有数据
            db.session.query(PermissionMenu).filter(
                PermissionMenu.premission_id == permission_id
            ).delete(synchronize_session=False)
            print(f"删除{permission_id}对应权限！")

            # 构建批量插入的数据
            new_permissions = [
                PermissionMenu(
                    premission_id=permission_id,
                    menu_id=item.get('menu_id'),
                    permissions_list=item.get('permissions_list')
                ) for item in permission_list
            ]

            # 批量插入新的权限数据
            db.session.bulk_save_objects(new_permissions)
            db.session.commit()
            print(f"新增{permission_id}对应权限！")

            return jsonify({'code': 200, 'msg': '修改权限对应菜单标识完成！',})

        except Exception as e:
            # 捕获任何异常并回滚事务
            db.session.rollback()
            return jsonify({'code': 500, 'msg': f'操作失败，错误信息: {str(e)}'})
    else:
        return jsonify({'code': 400, 'msg': '权限标识数据为空！'})


# 角色信息添加接口（角色管理）
@role_view.route('/permission_manage_add', methods=['POST'])
@jwt_required()
@jwt_required_with_refresh
def permission_manage_add():
    """
    角色信息添加接口

    参数:
        permission_name (str): 要新增的角色名称。
        permission_content (str): 要新增的角色描述。
        permission_code (str): 要新增的角色标识。
        permission_status (str): 要新增的角色状态 1启用 0禁用。
    """

    permission_name = strip_whitespace(request.form.get('permission_name',None))
    permission_content = strip_whitespace(request.form.get('permission_content',None))
    permission_code = strip_whitespace(request.form.get('permission_code',None))
    permission_status = strip_whitespace(request.form.get('permission_status',1))

    # 检查是否提供了必要的角色信息
    if not all([permission_name, permission_content,permission_status]):
        return jsonify({'code': 400, 'msg': '角色姓名、描述为必填项！'})


    if  db.session.query(Permission).filter(Permission.permission_name==permission_name).first():
        return jsonify({'code': 400, 'msg': '角色名称已经存在!'})

    # 创建新的用户记录
    new_permission = Permission(permission_name=permission_name, permission_content=permission_content,
                          permission_code=permission_code, permission_status=permission_status)

    try:
        # 将新角色添加到数据库会话
        db.session.add(new_permission)
        db.session.commit()  # 提交以获取新用户的ID

        return jsonify({'code': 200, 'msg': '角色添加成功！'})

    except Exception as e:

        # 发生异常时回滚事务
        db.session.rollback()
        return jsonify({'code': 500, 'msg': f'角色添加失败: {str(e)}'})


# 角色信息修改接口（角色管理）
@role_view.route('/permission_manage_info_update', methods=['POST'])
@jwt_required()
@jwt_required_with_refresh
def permission_manage_info_update():
    """
    角色信息修改接口

    参数:
        permission_id (str): permission_id。
        permission_name (str): 要更新的角色名称。
        permission_content (str): 要更新的角色描述。
        permission_code (str): 要更新的角色标识。
        permission_status (str): 要更新的角色状态 1启用 0禁用。
    """

    permission_id = strip_whitespace(request.form.get('permission_id',None))
    permission_name = strip_whitespace(request.form.get('permission_name',None))
    permission_content = strip_whitespace(request.form.get('permission_content',None))
    permission_code = strip_whitespace(request.form.get('permission_code',None))
    permission_status = strip_whitespace(request.form.get('permission_status',1))

    # 检查是否提供了必要的角色信息
    if not all([permission_id]):
        return jsonify({'code': 400, 'msg': '角色id不存在！'})

    try:

        db.session.query(Permission).filter(Permission.id == permission_id).update(
            {
                'permission_name': permission_name,
                'permission_content': permission_content,
                'permission_code': permission_code,
                'permission_status': permission_status,

            }
        )
        db.session.commit()  # 提交以修改对应的ID数据

        return jsonify({'code': 200, 'msg': '角色信息修改成功！'})

    except Exception as e:

        # 发生异常时回滚事务
        db.session.rollback()
        return jsonify({'code': 500, 'msg': f'角色修改失败: {str(e)}'})



